1 module unde.games.obj_writer; 2 3 import unde.games.obj_loader; 4 import std.algorithm; 5 import std.array; 6 import std.conv; 7 import std.path; 8 import std.stdio; 9 10 import std.string; 11 12 void save_objfile(ObjFile *obj) 13 { 14 auto file = File(obj.filename, "w"); 15 16 int[3] num; 17 18 file.writefln("# Dizzy Omega scene splitter"); 19 file.writefln(""); 20 file.writefln("mtllib %s", obj.mtl.filename.absolutePath().asRelativePath(absolutePath(dirName(obj.filename)))); 21 file.writefln(""); 22 foreach (object; obj.objects) 23 { 24 file.writefln("o %s", object.name); 25 26 foreach (vertice; object.vertices) 27 file.writefln("v %.6f %.6f %.6f", vertice[0], vertice[1], vertice[2]); 28 29 foreach (texcoord; object.texcoords) 30 file.writefln("vt %.6f %.6f", texcoord[0], texcoord[1]); 31 32 foreach (normal; object.normals) 33 file.writefln("vn %.6f %.6f %.6f", normal[0], normal[1], normal[2]); 34 35 foreach (mesh; object.meshes) 36 { 37 if (mesh.material !is null) 38 file.writefln("usemtl %s", mesh.material); 39 40 file.writefln("s %s", mesh.smooth?"1":"off"); 41 42 foreach (face; mesh.faces) 43 { 44 if (face[0].normal >= 0) 45 { 46 file.writef("f"); 47 foreach (p; face) 48 { 49 if (p.tex >= 0) 50 file.writef(" %s/%s/%s", p.vert+num[0]+1, p.tex+num[1]+1, p.normal+num[2]+1); 51 else 52 file.writef(" %s//%s", p.vert+num[0]+1, p.normal+num[2]+1); 53 } 54 } 55 else if (face[0].tex >= 0) 56 { 57 file.writef("l"); 58 foreach (p; face) 59 { 60 file.writef(" %s/%s", p.vert+num[0]+1, p.tex+num[1]+1); 61 } 62 } 63 else 64 { 65 file.writef("p"); 66 foreach (p; face) 67 { 68 file.writef(" %s", p.vert+num[0]+1); 69 } 70 } 71 file.writefln(""); 72 } 73 } 74 75 num[0] += object.vertices.length; 76 num[1] += object.texcoords.length; 77 num[2] += object.normals.length; 78 } 79 }